from typing import List
from llm.LLMProcessor import LLMProcessor

class AnswerForUserQuestion(LLMProcessor):
    """
    你作为经验丰富、遵循循证医学指导思想的全科医学专家，不急于给出答案，认真分析上下文，认真评估答案的可信度，尽可能提高答案的质量，给出准确的答案评分，请严格按以下步骤处理用户查询：

    #1. 分析用户问题：{question}
    #2. 检查上下文与用户问题的相关性，当前上下文：
    {chunks}

    #3. 评分标准（0-100分，分数越高，答案质量越好）：
    完整度（50%）：答案涵盖核心要点
    可靠度（50%）：信息准确，有上下文依据
    ### 如果用户给出的当前上下文和用户的问题无关，应该给一个很低的分数，并且在<answer>中提示用户。在<extra_question>给出关键信息，让用户根据这些信息补充上下文。

    ###若满足以下任一情况应要求补充信息：
    ① 上下文未提及问题中的关键实体
    ② 缺少必要的因果关系
    ③ 存在时间/空间信息断层
    ④ 需要专业领域知识推导

    #4. 输出规则：
    1、输出答案时：注意answer标签中内容格式的美观、简洁，删除过多的空白占位符。rate标签只需要返回一个整数来代表答案质量的评分。
    2、严格遵循XML标签层级,这很重要!!!
    3、<answer>中的答案禁止包含类似“根据提供的上下文”等和答案无关的内容，直接给出你的答案。
    4、用以下格式输出的内容：
        <answer>详细回答，包含数据来源说明</answer>
        <rate>根据标准评分</rate>
        <extra_questions>
        <extra_question>缺失信息检索相关1（要求：缺失信息检索关键词，不要包含额外信息）</extra_question>
        <extra_question>缺失信息检索相关2（要求：具体的搜索关键词，不要包含额外信息）</extra_question>
        </extra_questions>
    """

    def __init__(self, question: str, chunks: list[str]):
        """Initialize with user question and relevant text chunks"""
        super().__init__()
        self.question = question
        self.chunks = "\n----------------\n".join(chunks)
    
    def extract(self, content: str) ->  tuple[bool, List[any]]:
        """Extract answer from XML formatted content"""
        import re
        # Find content between <answer> tags
        #answer_match = re.search(r'<answer>(.*?)</answer>', content, re.DOTALL)
        answer_match = re.search(r'<answer>[\n\s]*(.*?)[\n\s]*</answer>', content, re.DOTALL)
        #rate_match = re.search(r'<rate>([0-9]*?)</rate>', content, re.DOTALL)
        rate_match = re.search(r'<rate>[\n\s]*([0-9]*?)[\n\s]*</rate>', content, re.DOTALL)
        rate = rate_match.group(1).strip()
        answer = answer_match.group(1).strip()
        print(answer, '\n', rate)
        if int(rate)>=90:
            return True, [answer, rate , []]
        else:
            # 匹配<extra_question>标签内容的正则表达式，考虑换行和空格
            pattern = r'<extra_question>\s*([^<]+?)\s*</extra_question>'
            matches = re.findall(pattern, content, re.DOTALL)
            extra_questiones = [match.strip() for match in matches if match.strip()]
            return False, [answer, rate, extra_questiones]


